﻿using System;
using System.Collections.Generic;
using System.Net.Mail;
using Kaleida.ServiceMonitor.Framework;
using Kaleida.ServiceMonitor.Model;
using Kaleida.ServiceMonitor.Model.Parsing;
using Kaleida.ServiceMonitor.Model.Runtime;
using NUnit.Framework;

namespace Kaleida.UnitTests.Model
{
	[TestFixture]
	public class ThresholdChangeEmailerTests
	{
		[Test]
		[ExpectedException(typeof (InvalidOperationException), ExpectedMessage = "SmtpServer is not set in the config. Cannot send emails from script 'myScript'")]
		public void TestExceptionIsThrownOnStartIfSmtpServerNotSet()
		{
			var configuration = new MockConfiguration { EmailSenderAddress = new MailAddress("servicemon@example.com") };

			InitialiseAndStartMonitoring(configuration, "#email-on-threshold-change \"me@example.com\"");
		}

		[Test]
		[ExpectedException(typeof (InvalidOperationException), ExpectedMessage = "EmailSenderAddress is not set in the config. Cannot send emails from script 'myScript'")]
		public void TestExceptionIsThrownOnStartIfEmailSenderAddressNotSet()
		{
			var configuration = new MockConfiguration { SmtpServer = "localhost" };

			InitialiseAndStartMonitoring(configuration, "#email-on-threshold-change \"me@example.com\"");
		}

		private static void InitialiseAndStartMonitoring(MockConfiguration configuration, string script)
		{
			ScriptParser.Initialise(new DummyFactory(), new DummyFactory());
			var monitor = new Monitor(configuration);
			monitor.Workspace.NewScript(@"C:\dummy\myScript.mscr");
			monitor.Workspace.CurrentScript.Content = script;
			Assert.IsNotNull(monitor.State.ScriptCompilation);
			Assert.IsTrue(monitor.State.ScriptCompilation.Succeeded);

			var emailer = new ThresholdChangeEmailer(monitor);
			emailer.OnStartedMonitoring();
		}

		private class DummyFactory : IPreparedRequestFactory, IResponseHandlerFactory
		{
			PreparedRequest IPreparedRequestFactory.Build(string name, IList<string> arguments)
			{
				throw new NotImplementedException();
			}

			ResponseHandler IResponseHandlerFactory.Build(string name, IList<string> arguments)
			{
				throw new NotImplementedException();
			}
		}
	}
}
